Encapsulación

Consiste en denegar el acceso a los atributos y métodos internos de la clase desde el exterior.

En Python no existe, pero se puede simular precediendo atributos y métodos con dos barras bajas __:


In [1]:
class Ejemplo:
    __atributo_privado = "Soy un atributo inalcanzable desde fuera"
    
    def __metodo_privado(self):
        print("Soy un método inalcanzable desde fuera")

In [2]:
e = Ejemplo()

In [3]:
e.__atributo_privado


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-73328dd71c23> in <module>()
----> 1 e.__atributo_privado

AttributeError: 'Ejemplo' object has no attribute '__atributo_privado'

In [4]:
e.__metodo_privado()


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-164c67db4a9b> in <module>()
----> 1 e.__metodo_privado()

AttributeError: 'Ejemplo' object has no attribute '__metodo_privado'

Cómo acceder

Internamente la clase sí puede acceder a sus atributos y métodos encapsulados, el truco consiste en crear sus equivalentes "publicos":


In [1]:
class Ejemplo:
    __atributo_privado = "Soy un atributo inalcanzable desde fuera"
    
    def __metodo_privado(self):
        print("Soy un método inalcanzable desde fuera")
        
    def atributo_publico(self):
        return self.__atributo_privado
        
    def metodo_publico(self):
        return self.__metodo_privado()

In [2]:
e = Ejemplo()

In [3]:
e.atributo_publico()


Out[3]:
'Soy un atributo inalcanzable desde fuera'

In [4]:
e.metodo_publico()


Soy un método inalcanzable desde fuera